

<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  
  <title>MDS 日志记录 &mdash; Ceph Documentation</title>
  

  
  <link rel="stylesheet" href="../../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/graphviz.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/css/custom.css" type="text/css" />

  
  

  
  

  

  
  <!--[if lt IE 9]>
    <script src="../../_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
    
      <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
        <script src="../../_static/jquery.js"></script>
        <script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
        <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
        <script src="../../_static/doctools.js"></script>
        <script src="../../_static/sphinx_highlight.js"></script>
    
    <script type="text/javascript" src="../../_static/js/theme.js"></script>

    
    <link rel="index" title="Index" href="../../genindex/" />
    <link rel="search" title="Search" href="../../search/" />
    <link rel="next" title="文件布局" href="../file-layouts/" />
    <link rel="prev" title="与 POSIX 标准的差异" href="../posix/" /> 
</head>

<body class="wy-body-for-nav">

   
  <header class="top-bar">
    <div role="navigation" aria-label="Page navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="../../" class="icon icon-home" aria-label="Home"></a></li>
          <li class="breadcrumb-item"><a href="../">Ceph 文件系统</a></li>
      <li class="breadcrumb-item active">MDS 日志记录</li>
      <li class="wy-breadcrumbs-aside">
            <a href="../../_sources/cephfs/mds-journaling.rst.txt" rel="nofollow"> View page source</a>
      </li>
  </ul>
  <hr/>
</div>
  </header>
  <div class="wy-grid-for-nav">
    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search"  style="background: #eee" >
          

          
            <a href="../../" class="icon icon-home"> Ceph
          

          
          </a>

          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../search/" method="get">
    <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        
        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../start/">Ceph 简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../install/">安装 Ceph</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../cephadm/">Cephadm</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../rados/">Ceph 存储集群</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../">Ceph 文件系统</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../#cephfs">CephFS 入门</a></li>
<li class="toctree-l2"><a class="reference internal" href="../#id4">管理</a></li>
<li class="toctree-l2"><a class="reference internal" href="../#id5">挂载 CephFS</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../#id6">CephFS 内幕</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../mds-states/"> MDS 的各种状态</a></li>
<li class="toctree-l3"><a class="reference internal" href="../posix/"> POSIX 兼容性</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#"> MDS 日志记录</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#cephfs">CephFS 元数据存储池</a></li>
<li class="toctree-l4"><a class="reference internal" href="#cephfs-mds">CephFS MDS 日志记录</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id1">日志事件</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id2">日志事件类型</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id3">日志分段</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id4">配置</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../file-layouts/"> 文件布局</a></li>
<li class="toctree-l3"><a class="reference internal" href="../mdcache/"> 分布式元数据缓存</a></li>
<li class="toctree-l3"><a class="reference internal" href="../dynamic-metadata-management/"> CephFS 内的动态元数据管理</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cephfs-io-path/"> CephFS IO 路径</a></li>
<li class="toctree-l3"><a class="reference internal" href="../charmap/"> 大小写敏感和规范化</a></li>
<li class="toctree-l3"><a class="reference internal" href="../lazyio/"> LazyIO</a></li>
<li class="toctree-l3"><a class="reference internal" href="../dirfrags/"> 目录分片的配置</a></li>
<li class="toctree-l3"><a class="reference internal" href="../multimds/"> 多活 MDS 的配置</a></li>
<li class="toctree-l3"><a class="reference internal" href="../snapshots/"> 快照</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../#id7">故障排除和灾难恢复</a></li>
<li class="toctree-l2"><a class="reference internal" href="../#id9">更多细节</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../rbd/">Ceph 块设备</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../radosgw/">Ceph 对象网关</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../mgr/">Ceph 管理器守护进程</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../mgr/dashboard/">Ceph 仪表盘</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../monitoring/">监控概览</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/">API 文档</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../architecture/">体系结构</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../dev/developer_guide/">开发者指南</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../dev/internals/">Ceph 内幕</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../governance/">项目管理</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../foundation/">Ceph 基金会</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../ceph-volume/">ceph-volume</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../releases/general/">Ceph 版本（总目录）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../releases/">Ceph 版本（索引）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../security/">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../hardware-monitoring/">硬件监控</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary/">Ceph 术语</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../jaegertracing/">Tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../translation_cn/">中文版翻译资源</a></li>
</ul>

            
          
        </div>
        
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" aria-label="top navigation">
        
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../../">Ceph</a>
        
      </nav>


      <div class="wy-nav-content">
        
        <div class="rst-content">
        
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
<div id="dev-warning" class="admonition note">
  <p class="first admonition-title">Notice</p>
  <p class="last">This document is for a development version of Ceph.</p>
</div>
  <div id="docubetter" align="right" style="padding: 5px; font-weight: bold;">
    <a href="https://pad.ceph.com/p/Report_Documentation_Bugs">Report a Documentation Bug</a>
  </div>

  
  <section id="mds">
<h1>MDS 日志记录<a class="headerlink" href="#mds" title="Permalink to this heading"></a></h1>
<section id="cephfs">
<h2>CephFS 元数据存储池<a class="headerlink" href="#cephfs" title="Permalink to this heading"></a></h2>
<p>CephFS 用一个单独的（元数据）存储池来管理 Ceph 文件系统中的文件元数据
（ inodes 和 dentry ）。元数据存储池拥有 Ceph 文件系统中文件的所有信息，
包括文件系统层次结构。此外， CephFS 还维护与文件系统中其他实体相关的元信息，
如文件系统日志、打开文件表、会话映射等。</p>
<p>本文档介绍 Ceph 元数据服务器如何使用和依赖日志。</p>
</section>
<section id="cephfs-mds">
<h2>CephFS MDS 日志记录<a class="headerlink" href="#cephfs-mds" title="Permalink to this heading"></a></h2>
<p>在执行文件系统操作之前， CephFS 元数据服务器会把元数据事件汇集成日志流，
放入元数据存储池中的 RADOS 。活跃 MDS 守护进程管理 CephFS 中文件和目录的元数据。</p>
<p>CephFS 使用日志有几个原因：</p>
<ol class="arabic simple">
<li><p>一致性：在 MDS 故障切换时，通过重放日志事件可以达到一致的文件系统状态。
此外，需要对后端存储进行多次更新的元数据操作也需要日志来实现崩溃一致性
（以及其他一致性机制，如加锁等）。</p></li>
<li><p>性能：日志更新（大部分）是顺序操作，因此日志的更新速度很快。
此外，可以一次写入一批更新，从而节省了更新文件不同部分所需的磁盘寻道时间。
拥有大容量日志还有助于热备 MDS 预热缓存，
从而间接地帮助 MDS 故障切换。</p></li>
</ol>
<p>每个活跃的元数据服务器都在元数据存储池中维护着自己的日志。
日志条带花到了多个对象上。元数据服务器会剔除不需要的日志条目（视为旧日志）。</p>
</section>
<section id="id1">
<h2>日志事件<a class="headerlink" href="#id1" title="Permalink to this heading"></a></h2>
<p>除了记录文件系统元数据更新日志外， CephFS 还记录各种其他事件，
如客户端会话信息、和目录导入/导出状态等。
这些事件在元数据服务器重建正确的状态时是必需的，比如，
Ceph MDS 在重启后试图重连客户端，重放日志事件时，
日志里的一种事件类型表明：有个客户端实体类型和这个 MDS 重启前有过一个会话。</p>
<p>要检查日志中记录的此类事件， CephFS 有一个命令行工具
<cite>cephfs-journal-tool</cite> ，使用方法如下：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cephfs</span><span class="o">-</span><span class="n">journal</span><span class="o">-</span><span class="n">tool</span> <span class="o">--</span><span class="n">rank</span><span class="o">=&lt;</span><span class="n">fs</span><span class="o">&gt;</span><span class="p">:</span><span class="o">&lt;</span><span class="n">rank</span><span class="o">&gt;</span> <span class="n">event</span> <span class="n">get</span> <span class="nb">list</span>
</pre></div>
</div>
<p><cite>cephfs-journal-tool</cite> 还能用于发现和修复损坏的 Ceph 文件系统。
（详情见 <a class="reference internal" href="../cephfs-journal-tool/"><span class="doc">cephfs-journal-tool</span></a> ）</p>
</section>
<section id="id2">
<h2>日志事件类型<a class="headerlink" href="#id2" title="Permalink to this heading"></a></h2>
<p>下面是 MDS 记入日志的各种事件类型。</p>
<ol class="arabic simple">
<li><p><cite>EVENT_COMMITTED</cite>: 把一个请求（ id ）标记为已提交。</p></li>
<li><p><cite>EVENT_EXPORT</cite>: 把目录映射到一个 MDS rank 。</p></li>
<li><p><cite>EVENT_FRAGMENT</cite>: 跟踪目录分段的各种阶段（分割、合并）。</p></li>
<li><p><cite>EVENT_IMPORTSTART</cite>: 一个 MDS rank 开始导入目录分段时做个记录。</p></li>
<li><p><cite>EVENT_IMPORTFINISH</cite>: 一个 MDS rank 完成目录分段导入后做个记录。</p></li>
<li><p><cite>EVENT_NOOP</cite>: 无操作事件类型用于跳过一段日志区间。</p></li>
<li><p><cite>EVENT_OPEN</cite>: 跟踪那些 inode 有打开的文件句柄。</p></li>
<li><p><cite>EVENT_RESETJOURNAL</cite>: 用于把日志标记为截断后重置（ <cite>reset</cite> ）。</p></li>
<li><p><cite>EVENT_SESSION</cite>: 跟踪打开的客户端会话。</p></li>
<li><p><cite>EVENT_SLAVEUPDATE</cite>: 记录转发到其他（辅助的） mds 的那个操作的各种阶段。</p></li>
<li><p><cite>EVENT_SUBTREEMAP</cite>: 目录 inode 到目录内容（子树分区）的映射关系。</p></li>
<li><p><cite>EVENT_TABLECLIENT</cite>: 记录 MDS 视角下的客户端表（快照 snap 、锚点 anchor ）的转换状态。</p></li>
<li><p><cite>EVENT_TABLESERVER</cite>: 记录 MDS 视角下的服务器表（快照、锚点）的转换状态。</p></li>
<li><p><cite>EVENT_UPDATE</cite>: 记录一个 inode 上的文件操作。</p></li>
<li><p><cite>EVENT_SEGMENT</cite>: 记录一个新日志分段的边界。</p></li>
<li><p><cite>EVENT_LID</cite>: 标记没有逻辑子树映射的日志起始点。</p></li>
</ol>
</section>
<section id="id3">
<h2>日志分段<a class="headerlink" href="#id3" title="Permalink to this heading"></a></h2>
<p>MDS 日志由逻辑段组成，代码中称为 LogSegments 。
这些分段用于把多个事件的元数据更新收集到一个逻辑单元中，以方便修剪。
每当日志尝试提交元数据操作（例如把文件创建作为 omap 更新刷到 dirfrag 对象）时，
日志都会在 LogSegment 中把它们汇集成可重放的一批更新。
这些更新必须是可重放的，以防 MDS 在对各种元数据对象进行一系列更新时出现故障。
之所以要批量更新，是因为要把对同一元数据对象（一个 dirfrag ）的更新进行分组，
因为多个 omap 条目可能是在同一时间段内更新的。</p>
<p>一旦某个分段被修剪掉，就会被视为“过期了”。过期的分段可由日志程序删除，
因为它的所有更新都已经刷回到后端的 RADOS 对象里了。
具体做法是更新日志程序的“过期位置 (expire position)”，使其超过过期分段的末尾。
某些过期分段可能会保留在日志中，以便在 MDS 重启时有更多缓存位于本地。</p>
<p>在 CephFS 的大部分历史中（直到 2023 年），日志分段都是由子树映射（ <code class="docutils literal notranslate"><span class="pre">ESubtreeMap</span></code> 事件）划分的。这样做的主要原因是，
日志恢复必须从子树映射的副本开始，然后才能重放其他事件。</p>
<p>现在，日志段可以通过 <code class="docutils literal notranslate"><span class="pre">SegmentBoundary</span></code> 事件来划分。
这些事件包括 <code class="docutils literal notranslate"><span class="pre">ESubtreeMap</span></code> 、 <code class="docutils literal notranslate"><span class="pre">EResetJournal</span></code> 、
<code class="docutils literal notranslate"><span class="pre">ESegment</span></code> (2023) 或 <code class="docutils literal notranslate"><span class="pre">ELid</span></code> (2023)。
对于 <code class="docutils literal notranslate"><span class="pre">ESegment</span></code> ，这种轻量级分段边界允许 MDS 减少记录子树映射日志的频率，
还能保持较小的日志段，同时修剪事件也简短。
为了维持约束条件，也就是日志重放看到的第一个事件是 <code class="docutils literal notranslate"><span class="pre">ESubtreeMap</span></code> ，
以该事件开头的分段被当作“主要段 (major segments)”，
并在删除过期段时增加了新的约束条件：
日志的第一个段必须始终是主要段。</p>
<p><code class="docutils literal notranslate"><span class="pre">ELid</span></code> 事件用于把 MDS 日志标记为“新的”，这个时候，
对其他操作来说逻辑 <code class="docutils literal notranslate"><span class="pre">LogSegment</span></code> 和日志序列号是必需的，
特别是 MDSTable 操作。
MDS 在创建 rank 或关闭 rank 时使用该事件。
从这个初始状态重放 rank 时，不需要子树映射。</p>
</section>
<section id="id4">
<h2>配置<a class="headerlink" href="#id4" title="Permalink to this heading"></a></h2>
<p>以事件数量为单位的日志分段目标大小由以下因素控制：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_log_events_per_segment">
<span class="sig-name descname"><span class="pre">mds_log_events_per_segment</span></span><a class="headerlink" href="#confval-mds_log_events_per_segment" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>一个 MDS 日志分段里事件的最大数量。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">1024</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>上一个主要日志段之后的次要 mds 日志段数量由以下参数控制：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_log_minor_segments_per_major_segment">
<span class="sig-name descname"><span class="pre">mds_log_minor_segments_per_major_segment</span></span><a class="headerlink" href="#confval-mds_log_minor_segments_per_major_segment" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>自上一个主要分段之后的次要 mds 日志分段数，在它之后启动/记录一个主要分段。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">uint</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">16</span></code></p>
</dd>
<dt class="field-odd">min<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">8</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>此选项控制 MDS 修剪过期日志段的频率（值越高，
MDS 更新日志过期位置以便修剪的频率越低）。</p>
<p>分段的目标最大数由以下选项控制：</p>
<dl class="std confval">
<dt class="sig sig-object std" id="confval-mds_log_max_segments">
<span class="sig-name descname"><span class="pre">mds_log_max_segments</span></span><a class="headerlink" href="#confval-mds_log_max_segments" title="Permalink to this definition"></a></dt>
<dd><blockquote>
<div><p>日志里的片段（对象）达到多少时开始裁剪， 设为 <code class="docutils literal notranslate"><span class="pre">-1</span></code> 取消限制。</p>
<dl class="field-list simple">
<dt class="field-odd">type<span class="colon">:</span></dt>
<dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">uint</span></code></p>
</dd>
<dt class="field-even">default<span class="colon">:</span></dt>
<dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">128</span></code></p>
</dd>
</dl>
</div></blockquote>
</dd></dl>

<p>由于非主要分段等着修剪成下一个主要分段，因此 MDS 通常会略高于这个数字。</p>
</section>
</section>



<div id="support-the-ceph-foundation" class="admonition note">
  <p class="first admonition-title">Brought to you by the Ceph Foundation</p>
  <p class="last">The Ceph Documentation is a community resource funded and hosted by the non-profit <a href="https://ceph.io/en/foundation/">Ceph Foundation</a>. If you would like to support this and our other efforts, please consider <a href="https://ceph.io/en/foundation/join/">joining now</a>.</p>
</div>


           </div>
           
          </div>
          <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
        <a href="../posix/" class="btn btn-neutral float-left" title="与 POSIX 标准的差异" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
        <a href="../file-layouts/" class="btn btn-neutral float-right" title="文件布局" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>&#169; Copyright 2016, Ceph authors and contributors. Licensed under Creative Commons Attribution Share Alike 3.0 (CC-BY-SA-3.0).</p>
  </div>

   

</footer>
        </div>
      </div>

    </section>

  </div>
  

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>

  
  
    
   

</body>
</html>